package com.softeem.service.impl;

import com.softeem.bean.Book;
import com.softeem.bean.CartItem;
import com.softeem.dao.BookDao;
import com.softeem.dao.CartItemDao;
import com.softeem.dao.impl.BookDaoImpl;
import com.softeem.dao.impl.CartItemDaoImpl;
import com.softeem.service.CartItemService;
import com.softeem.utils.Page;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CartItemServiceImpl implements CartItemService {
    private CartItemDao cartItemDao = new CartItemDaoImpl();
    private BookDao bookDao = new BookDaoImpl() ;
    //是需要开启事务
    @Override
    public Map addItem(CartItem cartItem , Integer bookId)throws SQLException {
        //通过bookId查询book图书对象
        Book book = bookDao.queryBookById(bookId);
        //通过图书名与用户主键id可以查询到具体某一个<购物车项>
        CartItem cart = cartItemDao.findByNameAndUid(book.getName(), cartItem.getUid());
        //购物车项是不是空的.如果是空的就证明,该用户之前没有添加过此商品
        if(cart != null){
            //如果不等于空.那么此商品已经被该用户添加到购物车中,所以我们只用更新一下商品数量与商品总价即可
            cart.setCount( cart.getCount() + 1 );
            cart.setTotalPrice( cart.getCount()  * cart.getPrice() );
            //执行update,修改商品数量与总价
            cartItemDao.updateCartCountById(cart.getId() , cart.getCount() , cart.getTotalPrice());
        }else {
            //否则该用户之前并没有添加过此商品到购物车,所以我们要创建一个<购物车项>对象.并且添加到数据库中
            cartItem.setName(book.getName());
            cartItem.setPrice(book.getPrice());
            cartItem.setTotalPrice(cartItem.getCount()*cartItem.getPrice());
            //执行insert 添加一个全新的<购物车项>
            cartItemDao.addCart(cartItem);
        }
        Map map = new HashMap();
        //通过用户uid查询此用户购物车中的商品件数
        Integer count = cartItemDao.findByUidCount(cartItem.getUid());
        map.put("bookCount" , count);//将商品件数保存到map中
        map.put("bookName" , book.getName());//将图书名称保存到map中
        return map;
    }

    @Override
    public void deleteItem(Integer id)throws SQLException {
        cartItemDao.deleteCartById(id);
    }

    @Override
    public void clear(Integer uid)throws SQLException {
        cartItemDao.deleteCartByUid(uid);
    }

    @Override
    public void updateCount(Integer id, Integer count,Double totalPrice) throws SQLException{
        cartItemDao.updateCartCountById(id,count,totalPrice);
    }

    @Override
    public CartItem findByNameAndUid(String name, Integer uid)throws SQLException {
        return cartItemDao.findByNameAndUid(name,uid);
    }

    @Override
    public Page<CartItem> page(Integer pageNo, Integer pageSize,Integer uid) throws SQLException{
        Page<CartItem> page = new Page<>();
        page.setPageNo(pageNo);//将参数pageNo保存到page对象
        page.setPageSize(pageSize);//将参数pageSize保存到page对象

        //获取t_book表的总记数 , 并将总记数封装到page对象中
        page.setPageTotalCount( cartItemDao.findByUidCount(uid));
        //求出最大页
        if( page.getPageTotalCount() % page.getPageSize() == 0 ){
            //使用  [总记录数 / 当前页显示数量 = 总页数]
            page.setPageTotal( page.getPageTotalCount() / pageSize );
        }else{
            //如果除不净的话,就需要+1  [总记录数 / 当前页显示数量 = 总页数 + 1]
            page.setPageTotal( page.getPageTotalCount() / pageSize + 1);
        }

        //如果当前页大于最大页
        if( page.getPageNo() > page.getPageTotal() ){
            page.setPageNo(page.getPageTotal());//就将最大页设置给当前页
        }
        //如果当前页小于最小页
        if( page.getPageNo() < 1 ){
            page.setPageNo(1);//就将第一页设置给当前页
        }

        //通过当前网与每页显示数 求出 起始页
        int begin = (page.getPageNo() - 1) * page.getPageSize();
        List<CartItem> cartList = cartItemDao.findCartByUid(begin, page.getPageSize(),uid);
        page.setItems(cartList);//将查询出来的结果集对象保存到page中
        return page;
    }
}
